package com.young.core.manager;

import com.young.core.enums.LockTypeEnum;
import org.springframework.transaction.annotation.Transactional;

public interface LockManager {

    /**
     *
     * @param namespace
     * @param owner
     * @param ttl
     * @return
     * 1、如果锁过期或锁不存在，此场景特别注意，当前节点是master时也可能存在锁意外丢失问题，比如DB在一个ttl内不可达
     *   1.1 抢锁成功，返回PROMOTED-新晋；
     *   1.2 抢锁失败，返回LEAVE-离任
     * 2、如果锁已存在
     *   2.1 续约成功，返回STAY-保持，表示master可以继续执行
     *   2.2 续约失败，返回LEAVE-离任，表示master已丢失锁
     * 3、如果发生异常，表明锁状态不可预测，需要重试，则返回UNKNOWN-未知
     */
    @Transactional
    LockTypeEnum lock(String namespace, String owner, int ttl);

    @Transactional
    boolean unlock(String namespace, String owner);

    @Transactional
    void ensure(String namespace);
}
